home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Applications / NIH Image 1.62b11 / Macros / MRI macros < prev    next >
Text File  |  1996-05-22  |  4KB  |  151 lines

  1. procedure CheckForStack;
  2. begin
  3.   if nPics=0 then begin
  4.     PutMessage('This macro requires a stack.');
  5.     exit;
  6.   end;
  7.   if nSlices=0 then begin
  8.     PutMessage('This window is not a stack.');
  9.     exit
  10.   end;
  11. end;
  12.  
  13.  
  14. procedure CheckForSelection;
  15. var 
  16.   x1,y1,x2,y2,LineWidth:integer;
  17. begin
  18.   GetRoi(RoiLeft,RoiTop,RoiWidth,RoiHeight);
  19.   GetLine(x1,y1,x2,y2,LineWidth);
  20.   if (RoiWidth=0) or (x1>=0) then begin
  21.     PutMessage('Please make a rectangular selection.');
  22.     exit;
  23.   end;
  24. end;
  25.  
  26.  
  27. procedure ResliceMRI(srcHorizontal,dstHorizontal:boolean);
  28. var
  29.   stack1,stack2,width,height:integer;
  30.   RoiLeft,RoiTop,RoiWidth,RoiHeight,max:integer;
  31.   loc,PixelSpacing:real;
  32.   InputSpacing,OutputSpacing:real; {mm}
  33.   scale:real; {pixels/mm}  
  34.   FirstTime:boolean;
  35. begin
  36.   scale:=1.0666; {Assumes 256x256 slices and 240mm field of view}
  37.   RequiresVersion(1.45);
  38.   CheckForStack;
  39.   CheckForSelection;
  40.   SaveState;
  41.   SetScale(scale,'mm');
  42.   SetBackground(0);
  43.   SetBackground(255);
  44.   stack1:=PicNumber;
  45.   InputSpacing:=GetSliceSpacing/scale;
  46.   if InputSpacing<=0 then InputSpacing:=1.5;
  47.   InputSpacing:=GetNumber('Input Slice Spacing (mm):',InputSpacing);
  48.   SetSliceSpacing(InputSpacing*scale);
  49.   OutputSpacing:=InputSpacing;
  50.   OutputSpacing:=GetNumber('Output Slice Spacing (mm):', OutputSpacing);
  51.   PixelSpacing:=OutputSpacing*scale;
  52.   FirstTime:=true;
  53.   GetRoi(RoiLeft,RoiTop,RoiWidth,RoiHeight);
  54.   if srcHorizontal then begin
  55.     loc:=RoiTop+PixelSpacing;
  56.     max:=RoiTop+RoiHeight;
  57.   end else begin
  58.     loc:=RoiLeft+PixelSpacing;
  59.     max:=RoiLeft+RoiWidth;
  60.   end;
  61.   while loc<max do begin
  62.     ChoosePic(stack1);
  63.     if srcHorizontal
  64.       then MakeLineRoi(RoiLeft,loc,RoiLeft+RoiWidth,loc)
  65.       else MakeLineRoi(loc,RoiTop,loc,RoiTop+RoiTop+RoiHeight);
  66.     if not dstHorizontal then SetOption;
  67.     Reslice;
  68.     SelectAll;
  69.     Copy;
  70.     GetPicSize(width,height);
  71.     Dispose;
  72.     if FirstTime then begin
  73.       SetNewSize(width,height);
  74.       MakeNewStack(OutputSpacing:1:2);
  75.       SetSliceSpacing(PixelSpacing);
  76.       stack2:=PicNumber;
  77.     end;
  78.     ChoosePic(stack2);
  79.     if not FirstTime then AddSlice;
  80.     Paste;
  81.     loc:=loc+PixelSpacing;
  82.     FirstTime:=false;
  83.   end;
  84.   SelectPic(stack1);
  85.   KillRoi;
  86.   SelectPic(stack2);
  87.   KillRoi;
  88.   RestoreState;
  89. end;
  90.  
  91.  
  92. macro 'Import GE Signa Files…';
  93. Var
  94.   i,n,max,stack,first:integer;
  95.   scale:real; {pixels/mm}
  96. begin
  97.   scale:=256 / 240; {assumes 256x256 slices with 240mm field of view}
  98.   first:=round(GetNumber('Number of first slice:',1));
  99.   max:=round(GetNumber('Maximum pixel value:',255));
  100.   SetNewSize(256,256);
  101.   MakeNewStack('Stack');
  102.   stack:=nPics;
  103.   MoveWindow(340,40);
  104.   SetScale(scale,'mm');
  105.   SetCustom(256,256,14336);
  106.   SetImport('Custom; 16-bits Signed; Fixed Scale');
  107.   SetImportMinMax(0,max);
  108.   n:=first;
  109.   for i:=1 to 256 do begin
  110.     Import('i.',n:3);
  111.     SetPicName('i.',n:3);
  112.     SelectAll;
  113.     Copy;
  114.     Dispose;
  115.     SelectPic(stack);
  116.     if n<>first then AddSlice;
  117.     n:=n+1;
  118.     Paste;
  119.    end;
  120. end;
  121.  
  122.  
  123. macro '(-' begin end;
  124.  
  125. macro 'Sagitals to Coronals…'; begin ResliceMRI(false,false) end;
  126. macro 'Sagitals to Axials…'; begin ResliceMRI(true,false) end;
  127. macro 'Coronals to Sagitals…'; begin ResliceMRI(false,false) end;
  128. macro 'Coronals to Axials…'; begin ResliceMRI(true,true) end;
  129. macro 'Axials to Coronals…'; begin ResliceMRI(true, true) end;
  130. macro 'Axials to Sagitals…'; begin ResliceMRI(false, true) end;
  131.  
  132.  
  133. macro '(-' begin end;
  134.  
  135. procedure flip(vertical:boolean);
  136. var
  137.   i:integer;
  138.   SliceSpacing:real;
  139. begin
  140.   CheckForStack;
  141.   for i:= 1 to nSlices do begin
  142.     SelectSlice(i);
  143.     if vertical
  144.       then FlipVertical
  145.       else FlipHorizontal;
  146.   end;
  147. end;
  148.  
  149. macro 'Flip Vertical';   begin flip(true) end;
  150. macro 'Flip Horizontal'; begin flip(false) end;
  151.